Функции можно вызывать в поле Variables блока или непосредственно в тексте ответа с помощью #{...}:

#{discord_add_role(message_from, '1465674567090704592')}

ID сервера, канала, роли и сообщения Discord — это длинные числовые значения. Проще всего их скопировать, включив Settings → Advanced → Developer Mode. После этого в контекстном меню любого объекта появится опция Copy ID.

Подключение бота описано в статье How to Create a Chatbot in Discord.

Где взять ID сообщения

ID сообщения, вызвавшего блок, хранится в переменной discord_message_id. Получать его отдельно не нужно:

#{discord_delete_message(discord_message_id)}

Если нужны данные, которых нет в предопределённых переменных, полный webhook доступен в переменной discord_webhook. Она заполняется, когда любой переменной присваивается значение save_webhook:

data = discord_webhook["data"]

msg_id = data["id"]

result = discord_reply_to_message(msg_id, "Это ответ на сообщение")

Автоматически создаваемые переменные

Эти переменные заполняются автоматически для каждого события и не требуют дополнительной настройки.

Переменная Описание Пример
guild_id ID сервера 1465674567090704591
discord_event Тип события одним словом message
discord_message_id ID сообщения с префиксом mid mid1465674569095319625
message_from ID автора события с префиксом uid uid413984787162726410
from_username Имя пользователя Discord автора 00rei
from_name Отображаемое имя автора в чате Rus
username Имя пользователя для личных сообщений боту 00rei
is_bot 1, если автор события — другой бот 0
nickname Прозвище на сервере; пусто, если не задано Moderator
roles Список ID ролей автора ["1465674567090704592"]
is_admin 1, если пользователь — администратор или владелец сервера 1
reply_from ID автора сообщения, на которое отвечают uid493121376652230668
reply_from_username Имя пользователя автора, на которого отвечают _deikin
reply_from_name Отображаемое имя автора, на которого отвечают Rus
reply_to_bot 1, если ответ адресован боту 0
reply_message_id ID сообщения, на которое отвечают mid1534837349219958804
reply_text Текст сообщения, на которое отвечают кто сегодня дежурит?

Префиксы uid, cid и mid являются частью значения. Передавайте эти переменные в функции как есть; удалять префиксы не нужно.

from_name vs. from_username

from_name содержит имя, которое следует использовать для обращения к пользователю в чате:

  1. Прозвище на сервере, если задано.
  2. Отображаемое имя аккаунта.
  3. Имя пользователя.

Это рекомендуемая переменная для использования в приветствиях, поскольку from_username может выглядеть как _deikin или 00rei.

Переменные reply_* заполняются только тогда, когда входящее сообщение является ответом на другое сообщение. Для обычных сообщений все они очищаются.

Поэтому следующее условие надёжно отличает ответ от обычного сообщения:

#{reply_from != ''}

Переменные nickname, roles и is_admin относятся к автору текущего события.

Discord не предоставляет эти данные для событий реакций, поэтому проверки администратора следует выполнять на событии сообщения или слеш-команды.

Текст входящего сообщения хранится в стандартной переменной question, как и в других каналах.


События

Помимо обычных сообщений, в воронку отправляются и служебные события.

Их текст хранится в переменной question, поэтому вы можете обрабатывать их с помощью обычных текстовых условий.

discord_event Текст в question Когда происходит
message Текст сообщения Участник отправляет сообщение
message_edit Обновлённый текст сообщения Сообщение редактируется
interaction /warn @user spam Используется слеш-команда или нажата кнопка
reaction_add new_like ❤️ uid413984787162726410 Добавлена реакция
reaction_remove reaction_remove ❤️ uid413984787162726410 Удалена реакция
message_delete message_delete mid1465674569095319625 Сообщение удалено
messages_delete_bulk messages_delete_bulk 12 Удалено несколько сообщений
member_join member_join uid413984787162726410 Участник присоединяется к серверу
member_leave member_leave uid413984787162726410 Участник покидает сервер
member_update member_update uid413984787162726410 Изменяется прозвище или роли участника
member_ban member_ban uid413984787162726410 Участник забанен
member_unban member_unban uid413984787162726410 Участник разбанен

Для пользовательской реакции вместо самого эмодзи используется ID пользовательского эмодзи:

new_like beer:1479419477396291696 uid413984787162726410

Подробнее см. в разделе Реакции.

Если блок должен срабатывать только на обычные сообщения от участников, добавьте следующее условие:

discord_event == 'message'

Это сразу отфильтрует все служебные события.

Проверка только текста события ненадёжна, так как участник может вручную отправить сообщение вида member_join.

Важно: member_update срабатывает при любом обновлении участника, включая назначение роли самим ботом. Блок, реагирующий на member_update и назначающий роль, может создать цикл, поэтому такие условия всегда следует соответствующим образом ограничивать.


Сообщения

Функция Описание
discord_send_message(channel_id, text) Отправить сообщение в любой канал
discord_send_dm(user_id, text) Отправить личное сообщение участнику
discord_reply_to_message(message_id, text) Ответить на сообщение
discord_edit_message(message_id, text) Редактировать сообщение, отправленное ботом
discord_delete_message(message_id) Удалить сообщение
discord_bulk_delete_messages(channel_id, message_ids) Удалить несколько сообщений за раз
discord_get_message(channel_id, message_id) Получить сообщение
discord_pin_message(message_id) Закрепить сообщение
discord_unpin_message(message_id) Открепить сообщение

Ограничения Discord: Нет ограничения по времени для редактирования или удаления собственных сообщений. Массовое удаление работает только для сообщений младше 14 дней, и за раз можно удалить от 2 до 100 сообщений.


Реакции

Функция Описание
discord_send_reaction(message_id, reaction) Добавить реакцию
discord_delete_reaction(message_id, reaction, user_id) Удалить реакцию. Если user_id опущен, удаляется реакция бота

Параметр reaction принимает либо обычный эмодзи, например ❤️, либо ID пользовательского эмодзи сервера.

Где взять ID пользовательской реакции

Добавьте нужную пользовательскую реакцию к любому сообщению в канале.

В чате появится такой колбэк:

new_like beer:1479419477396291696 uid413984787162726410

Здесь:

beer:1479419477396291696

— это ID реакции.

Вы можете скопировать его и использовать в функциях реакций:

#{discord_send_reaction(discord_message_id, 'beer:1479419477396291696')}

Обычные эмодзи отображаются в колбэках как есть:

new_like ❤️ uid413984787162726410

где uid413984787162726410 — ID участника, добавившего реакцию.


Модерация

Функция Описание
discord_timeout_member(user_id, seconds) Отправить участника в тайм-аут на указанное количество секунд, до 28 дней
discord_remove_timeout(user_id) Досрочно снять тайм-аут
discord_kick_member(user_id) Кикнуть участника с сервера; он может вернуться по приглашению
discord_ban_member(user_id, delete_message_seconds) Забанить участника; второй аргумент указывает, сколько секунд истории сообщений удалить, до 7 дней
discord_unban_member(user_id) Разбанить участника

Discord не позволяет боту модерировать участника, чья роль выше роли бота. Владелец сервера также не может быть подвергнут модерации.


Роли и участники

Функция Описание
discord_add_role(user_id, role_id) Назначить роль
discord_remove_role(user_id, role_id) Снять роль
discord_get_roles() Получить роли сервера и их ID
discord_get_member(user_id) Получить данные участника, включая прозвище, роли и дату присоединения
discord_set_nickname(user_id, nickname) Изменить прозвище участника на сервере

Роль бота должна быть выше роли, которую он назначает.

Роль @everyone и роли, управляемые интеграциями, включая роли других ботов, не могут быть назначены.


Каналы и тикеты

Функция Описание
discord_create_channel(name, type, parent_id, permission_overwrites) Создать канал
discord_delete_channel(channel_id) Удалить канал
discord_set_channel_permission(channel_id, target_id, allow, deny, type) Разрешить или запретить права доступа к каналу
discord_create_invite(channel_id, max_age, max_uses) Создать ссылку-приглашение
discord_get_invites() Получить ссылки-приглашения сервера

Для discord_create_channel значение по умолчанию type:

Значение Тип канала
0 Текстовый канал
2 Голосовой канал
4 Категория

Вы можете передать ID категории в parent_id, чтобы создать канал внутри этой категории.

Для discord_set_channel_permission последний аргумент указывает, кто получает права:

Значение Цель
1 Участник
0 Роль

Параметры allow и deny принимают следующие значения:

Значение Право
1024 Просмотр канала
2048 Отправка сообщений
3072 Просмотр канала и отправка сообщений
65536 Чтение истории сообщений

Для discord_create_invite время жизни приглашения указывается в секундах.

Например:

86400

означает 24 часа.

Значение max_uses равное 0 означает неограниченное количество использований.


Слеш-команды

Функция Описание
discord_get_commands() Получить команды, зарегистрированные на сервере
discord_set_commands(commands) Заменить весь набор команд

discord_set_commands принимает список команд:

#{discord_set_commands('[
  {
    "name": "rules",
    "description": "Показать правила сервера"
  },
  {
    "name": "warn",
    "description": "Выдать предупреждение",
    "options": [
      {
        "type": 6,
        "name": "user",
        "description": "Пользователь",
        "required": true
      },
      {
        "type": 3,
        "name": "reason",
        "description": "Причина",
        "required": false
      }
    ]
  }
]')}

Требования Discord

  • name должен содержать только строчные символы, без пробелов, и быть длиной от 1 до 32 символов.
  • description обязателен и должен быть длиной от 1 до 100 символов.
  • Обязательные опции должны располагаться перед необязательными.
  • Передача пустого списка удаляет все команды бота с сервера.

Типы опций

Тип Описание
3 Строка
4 Целое число
5 Булево значение
6 Участник
7 Канал
8 Роль

При вызове команды она отправляется в воронку в виде строки, например:

/warn @user spam

Иными словами, имя команды и значения опций разделяются пробелами.

Вы можете обработать её с помощью обычного текстового условия.

Отдельная функция для кнопок не требуется. Кнопки настраиваются в обычном блоке ответа, а нажатие кнопки обрабатывается так же, как слеш-команда: значение кнопки появляется в тексте.


Баллы и таблица лидеров

Интеграция с Discord включает встроенную систему благодарности. Баллы начисляются автору цитируемого сообщения.

Вы можете использовать её для создания уровней, рангов и таблиц лидеров.

Функция Описание
discord_add_thanks_score(value) Добавить баллы автору цитируемого сообщения
discord_add_thanks_score_for_answer(value) Добавить баллы участнику, который ответил
discord_minus_thanks_score(value) Удалить баллы
discord_get_score(user_id) Вернуть баллы участника в виде числа. Без аргумента использует автора события
discord_get_level(user_id, points_per_level) Получить уровень участника. Порог по умолчанию: 100 баллов за уровень
discord_get_user_info(user_id) Получить баллы, позицию в таблице лидеров и имя в виде одного объекта
discord_get_top(count, shift, humanize, delimiter) Получить таблицу лидеров

Для discord_get_top:

  • count — количество строк для возврата;
  • shift — количество строк для пропуска, полезно для пагинации;
  • humanize=true — возвращает готовый к отображению текст;
  • delimiter — разделитель между именем участника и баллами.

При сравнении баллов в условии блока используйте discord_get_score. Эта функция возвращает число, поэтому числовые сравнения работают как ожидается.


Примеры

Приветствие нового участника через личное сообщение

Условие блока:

member_join

В поле Переменные:

discord_send_dm(
    message_from,
    'Привет, #{from_name}! Ознакомься с закреплёнными правилами.'
)

Удаление сообщения, содержащего стоп-слово, и тайм-аут участника на 24 часа

Условие блока: список стоп-слов.

Дополнительное условие:

is_admin != 1

Функции:

discord_delete_message(discord_message_id)

discord_timeout_member(message_from, 86400)

Назначение роли за реакцию на определённое сообщение

Условие блока:

new_like 🍕

Дополнительное условие:

contains(discord_message_id, '1534927170965602324')

Функция:

discord_add_role(
    message_from,
    '1465674567090704592'
)

Создание приватного канала тикета по кнопке

ticket = discord_create_channel(
    'ticket-' + from_username
)

ticket_channel = get(
    get(ticket, 'data'),
    'id'
)

discord_set_channel_permission(
    ticket_channel,
    guild_id,
    None,
    1024,
    0
)

discord_set_channel_permission(
    ticket_channel,
    message_from,
    3072,
    None,
    1
)

discord_send_message(
    ticket_channel,
    'Опишите вашу проблему в одном сообщении.'
)

Первая строка разрешений скрывает канал от всех (здесь guild_id представляет роль @everyone).

Вторая строка делает канал доступным для участника, создавшего тикет.


Начисление баллов за благодарность и назначение роли по уровню

Условие блока:

thanks;thx;thank you

Дополнительное условие:

reply_from != '' and reply_from != message_from and reply_to_bot != 1

Функции:

discord_add_thanks_score(1)

if (discord_get_level(reply_from) >= 1) {
    discord_add_role(
        reply_from,
        '1465674567090704592'
    )
}

Условие:

reply_from != message_from

предотвращает начисление баллов самому себе.

Условие:

reply_to_bot != 1

предотвращает начисление баллов боту.


Показ своих баллов с помощью команды

Условие блока:

/xp

В поле Переменные:

points = discord_get_score()

lvl = discord_get_level()

Текст ответа:

#{from_name}, у вас #{points} XP · Уровень #{lvl}

Показ таблицы лидеров с помощью команды

Условие блока:

/top

Текст ответа:

🏆 Таблица лидеров XP:

#{discord_get_top(10, 0, true, ' — ')}